package string;
/*
1.字符串字面值“abc”也可以看做是一个字符串对象
2.字符串是常量，一旦被赋值，就是不能被改变

请简要描述一下字符串常量池的概念。
字符串常量池（String Constant Pool）是JVM的一部分，在Java8的环境下，字符串常量池在堆上。
字符串常量池用于存储所有的字符串字面量对象，每当代码中出现一个字符串字面量，JVM就会检查字符串常量池：
如果字符串常量池中已经存在相同内容的字符串，则不会创建新的对象，而是返回指向已有对象的引用。
如果不存在相同的字符串，则创建新的String对象并放入字符串常量池。
加之String对象是一个不可变对象，Java就通过字符串常量池实现了对String字面值对象的复用。
这样的设计，减少了String对象的创建频率，避免了不必要的对象创建，从而减少内存开销，提升程序的性能。
但是要注意，字符串常量池这种实现String对象共享的机制，仅适用于字面值String对象，任何通过new创建（构造器赋值）的String对象都不会自动将引用存储在字符串常量池中，因此不会被共享。
 */
public class Demo3_String {
    public static void main(String[] args) {
        String str = "abc";//"abc"可以看成一个字符串对象,意味着他可以调用String里面的方法
        System.out.println("str = " + str);
        System.out.println(str.toString());//String类重写了toString方法，所以他打印的不是地址

        str = "def";//当把"def"赋值给str，原来的"abc"就没有被引用从而变成了垃圾被回收
        System.out.println(str);

    }
}
